package com.Long.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @Title:
 * @Description:
 * @Author: guowl
 * @version： 1.0
 * @Date:2021/7/26
 * @Copyright: Copyright(c)2021 RedaFlight.com All Rights Reserved
 */
@Configuration
public class MyRabbitConfig {
        //讲对象序列化为JSON
        @Bean
        public MessageConverter messageConverter(){
            return new Jackson2JsonMessageConverter();
        }

        @Autowired
        RabbitTemplate rabbitTemplate;

        //定制RabbitTemplate
        @PostConstruct//MyRabbitConfig对象创建完成后执行这个初始化方法
        public void initRabbitTemplate(){
            //设置发送消息确认回调p->b
            rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback(){
                /**
                 * @param correlationData  当前消息的唯一关联数据  ，这个是消息的唯一id
                 * @param ack 消息是否成功收到
                 * @param cause 失败原因
                 */
                @Override
                public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                    System.out.println("confirm...correlationData=>"+correlationData+"----------ack==>"+ack+"--------cause  ==>"+cause);
                }
            });
            //设置消息抵达队列的失败回调
            rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
                /**
                 * 只要消息没有投递给指定的队列，就会触发这个失败回调
                 * @param message   投递失败的消息
                 * @param replyCode  回复的状态码
                 * @param replyText  回复的文本内容
                 * @param exchange  消息发送的交换机
                 * @param routingKey  消息走的路由键
                 */
                @Override
                public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                    System.out.println("returnedMessage-->"+message+"\nreplyCode-->"+replyCode+"\nexchange-->"+exchange+"\nroutingKey-->"+routingKey);
                }
            });
        }
    }

